package dao

import "database/sql"

// 事务包装函数

func TxDecorator(apply func(tx *sql.Tx) error) error {
	var (
		tx  *sql.Tx
		err error
	)

	defer func() {
		// 捕获panic进行回滚
		v := recover()
		if v != nil && tx != nil {
			tx.Rollback()
		}
	}()

	tx, err = client.Begin()
	if err != nil {
		tx.Rollback()
		return err
	}

	err = apply(tx)
	// DB 操作过程中出错, 回滚事务
	if err != nil {
		tx.Rollback()
		return err
	}

	// 未发生错误, 提交事务
	err = tx.Commit()
	if err != nil {
		return err
	}
	return nil
}
